package cz.stv.kucera_tomas_sen.auto;
import cz.stv.pecinovsky.správceplátna.*;
import cz.stv.pecinovsky.utility.*;

public class AutoJ implements IAuto1
{
    private Mnohotvar celek = null;
    private Obdélník karoserie = null;
    private Elipsa světlo_levé = null;
    private Elipsa světlo_pravé = null;
    public static final int VÝCHOD = 0;
    public static final int JIH = 2;
    public static final int ZÁPAD = 4;
    public static final int SEVER = 6;
    private Barva barva = Barva.MODRÁ;

    public AutoJ()
    {
        this( 0 ,0 );
    }

    public AutoJ( Mnohotvar source)
    {
        celek = source.kopie();
    }

    public AutoJ(int x, int y )
    {
        this( x, y, 100, 100, JIH);
    }

    public AutoJ(int x, int y, int šířka, int výška )
    {
        this( x, y, šířka, výška, JIH);
    }

    private AutoJ(int x, int y, int šířka, int výška, int směr)
    {
        double mš = ( double)šířka/100;
        double mv = ( double)výška/100;

        Obdélník pozadi = null;
        Obdélník okno_přední = null;
        Obdélník okno_zadní = null;
        Obdélník okno_levé = null;
        Obdélník okno_pravé = null;
        Obdélník kola_zadní = null;
        Obdélník kola_přední = null;

        pozadi = new Obdélník( x, y, (int)Math.round( mš * 100), (int)Math.round( mv * 100), Barva.STŘÍBRNÁ);
        if( směr == JIH)  {
            kola_přední = new Obdélník( (int)Math.round( x + mv * 15), (int)Math.round( y + mš * 70), (int)Math.round( mv * 70), (int)Math.round( mš * 15), Barva.ČERNÁ);
            kola_zadní = new Obdélník( (int)Math.round( x + mv * 15), (int)Math.round( y + mš * 20), (int)Math.round( mv * 70), (int)Math.round( mš * 15), Barva.ČERNÁ);
            karoserie = new Obdélník( (int)Math.round( x + mv * 20), (int)Math.round( y + mš * 0), (int)Math.round( mv * 60), (int)Math.round( mš * 100), barva);
            okno_přední = new Obdélník( (int)Math.round( x + mv * 25), (int)Math.round( y + mš * 70), (int)Math.round( mv * 50), (int)Math.round( mš * 15), Barva.BÍLÁ);
            okno_zadní = new Obdélník( (int)Math.round( x + mv * 25), (int)Math.round( y + mš * 20), (int)Math.round( mv * 50), (int)Math.round( mš * 15), Barva.BÍLÁ);
            okno_levé = new Obdélník( (int)Math.round( x + mv * 25), (int)Math.round( y + mš * 40), (int)Math.round( mv * 5), (int)Math.round( mš * 25), Barva.BÍLÁ);
            okno_pravé = new Obdélník( (int)Math.round( x + mv * 70), (int)Math.round( y + mš * 40), (int)Math.round( mv * 5), (int)Math.round( mš * 25), Barva.BÍLÁ);
            světlo_levé = new Elipsa( (int)Math.round( x + mv * 55), (int)Math.round( y + mš * 90), (int)Math.round( mv * 20), (int)Math.round( mš * 10), Barva.BÍLÁ);
            světlo_pravé = new Elipsa( (int)Math.round( x + mv * 25), (int)Math.round( y + mš * 90), (int)Math.round( mv * 20), (int)Math.round( mš * 10), Barva.BÍLÁ);
        }   else if( směr == ZÁPAD) {
            kola_přední = new Obdélník( (int)Math.round( x + mš * 65), (int)Math.round( y + mv * 15), (int)Math.round( mš * 15), (int)Math.round( mv * 70), Barva.ČERNÁ);
            kola_zadní = new Obdélník( (int)Math.round( x + mš * 15), (int)Math.round( y + mv * 15), (int)Math.round( mš * 15), (int)Math.round( mv * 70), Barva.ČERNÁ);
            karoserie = new Obdélník( (int)Math.round( x + mš * 0), (int)Math.round( y + mv * 20), (int)Math.round( mš * 100), (int)Math.round( mv * 60), barva);
            okno_přední = new Obdélník( (int)Math.round( x + mš * 65), (int)Math.round( y + mv * 25), (int)Math.round( mš * 15), (int)Math.round( mv * 50), Barva.BÍLÁ);
            okno_zadní = new Obdélník( (int)Math.round( x + mš * 15), (int)Math.round( y + mv * 25), (int)Math.round( mš * 15), (int)Math.round( mv * 50), Barva.BÍLÁ);
            okno_levé = new Obdélník( (int)Math.round( x + mš * 35), (int)Math.round( y + mv * 25), (int)Math.round( mš * 25), (int)Math.round( mv * 5), Barva.BÍLÁ);
            okno_pravé = new Obdélník( (int)Math.round( x + mš * 35), (int)Math.round( y + mv * 70), (int)Math.round( mš * 25), (int)Math.round( mv * 5), Barva.BÍLÁ);
            světlo_levé = new Elipsa( (int)Math.round( x + mš * 0), (int)Math.round( y + mv * 55), (int)Math.round( mš * 10), (int)Math.round( mv * 20), Barva.BÍLÁ);
            světlo_pravé = new Elipsa( (int)Math.round( x + mš * 0), (int)Math.round( y + mv * 25), (int)Math.round( mš * 10), (int)Math.round( mv * 20), Barva.BÍLÁ);
        } else if( směr == SEVER) {
            kola_přední = new Obdélník( (int)Math.round( y + mv * 15), (int)Math.round( x + mš * 65), (int)Math.round( mv * 70), (int)Math.round( mš * 15), Barva.ČERNÁ);
            kola_zadní = new Obdélník( (int)Math.round( y + mv * 15), (int)Math.round( x + mš * 15), (int)Math.round( mv * 70), (int)Math.round( mš * 15), Barva.ČERNÁ);
            karoserie = new Obdélník( (int)Math.round( y + mv * 20), (int)Math.round( x + mš * 0), (int)Math.round( mv * 60), (int)Math.round( mš * 100), barva);
            okno_přední = new Obdélník( (int)Math.round( y + mv * 25), (int)Math.round( x + mš * 65), (int)Math.round( mv * 50), (int)Math.round( mš * 15), Barva.BÍLÁ);
            okno_zadní = new Obdélník( (int)Math.round( y + mv * 25), (int)Math.round( x + mš * 15), (int)Math.round( mv * 50), (int)Math.round( mš * 15), Barva.BÍLÁ);
            okno_levé = new Obdélník( (int)Math.round( y + mv * 25), (int)Math.round( x + mš * 35), (int)Math.round( mv * 5), (int)Math.round( mš * 25), Barva.BÍLÁ);
            okno_pravé = new Obdélník( (int)Math.round( y + mv * 70), (int)Math.round( x + mš * 35), (int)Math.round( mv * 5), (int)Math.round( mš * 25), Barva.BÍLÁ);
            světlo_levé = new Elipsa( (int)Math.round( y + mv * 25), (int)Math.round( x + mš * 0), (int)Math.round( mv * 20), (int)Math.round( mš * 10), Barva.BÍLÁ);
            světlo_pravé = new Elipsa( (int)Math.round( y + mv * 55), (int)Math.round( x + mš * 0), (int)Math.round( mv * 20), (int)Math.round( mš * 10), Barva.BÍLÁ);
        }   else {
            kola_přední = new Obdélník( (int)Math.round( x + mš * 70), (int)Math.round( y + mv * 15), (int)Math.round( mš * 15), (int)Math.round( mv * 70), Barva.ČERNÁ);
            kola_zadní = new Obdélník( (int)Math.round( x + mš * 20), (int)Math.round( y + mv * 15), (int)Math.round( mš * 15), (int)Math.round( mv * 70), Barva.ČERNÁ);
            karoserie = new Obdélník( (int)Math.round( x + mš * 0), (int)Math.round( y + mv * 20), (int)Math.round( mš * 100), (int)Math.round( mv * 60), barva);
            okno_přední = new Obdélník( (int)Math.round( x + mš * 70), (int)Math.round( y + mv * 25), (int)Math.round( mš * 15), (int)Math.round( mv * 50), Barva.BÍLÁ);
            okno_zadní = new Obdélník( (int)Math.round( x + mš * 20), (int)Math.round( y + mv * 25), (int)Math.round( mš * 15), (int)Math.round( mv * 50), Barva.BÍLÁ);
            okno_levé = new Obdélník( (int)Math.round( x + mš * 40), (int)Math.round( y + mv * 25), (int)Math.round( mš * 25), (int)Math.round( mv * 5), Barva.BÍLÁ);
            okno_pravé = new Obdélník( (int)Math.round( x + mš * 40), (int)Math.round( y + mv * 70), (int)Math.round( mš * 25), (int)Math.round( mv * 5), Barva.BÍLÁ);
            světlo_levé = new Elipsa( (int)Math.round( x + mš * 90), (int)Math.round( y + mv * 25), (int)Math.round( mš * 10), (int)Math.round( mv * 20), Barva.BÍLÁ);
            světlo_pravé = new Elipsa( (int)Math.round( x + mš * 90), (int)Math.round( y + mv * 55), (int)Math.round( mš * 10), (int)Math.round( mv * 20), Barva.BÍLÁ);
        }

        Obdélník obálka = new Obdélník( x, y, šířka, výška, Barva.ŽÁDNÁ);
        celek = new Mnohotvar("");
        celek.přidej(pozadi, kola_zadní, kola_přední,
            karoserie, okno_přední, okno_zadní,
            okno_levé, okno_pravé, obálka);
        celek.přidejTvar( světlo_levé);
        celek.přidejTvar( světlo_pravé);

        celek.hotovo();
    }

    public void blikejL()
    {
        for( int i = 0; i < 3; i++) {
            světlo_levé.setBarva(Barva.ŽLUTÁ);
            IO.čekej(500);
            světlo_levé.setBarva(Barva.BÍLÁ);
            IO.čekej(500);
        }
    }

    public void blikejR()
    {
        for( int i = 0; i < 3; i++) {
            světlo_pravé.setBarva(Barva.ŽLUTÁ);
            IO.čekej(500);
            světlo_pravé.setBarva(Barva.BÍLÁ);
            IO.čekej(500);
        }
    }
    
        /***************************************************************************
     * @todo blikni - Je třeba ještě doplnit komentář
     */
    @Override
    public void blikni()
    {
        světlo_levé.setBarva(Barva.ŽLUTÁ);
        světlo_pravé.setBarva(Barva.ŽLUTÁ);
        IO.čekej(500);
        světlo_levé.setBarva(Barva.BÍLÁ);
        světlo_pravé.setBarva(Barva.BÍLÁ);
        IO.čekej(500);
    }
    
    public void blikej()
    {
        for( int i = 0; i < 3; i++) {
            světlo_levé.setBarva(Barva.ŽLUTÁ);
            světlo_pravé.setBarva(Barva.ŽLUTÁ);
            IO.čekej(500);
            světlo_levé.setBarva(Barva.BÍLÁ);
            světlo_pravé.setBarva(Barva.BÍLÁ);
            IO.čekej(500);
        }
    }

    public void setBarva( Barva b)
    {
        barva = b;
        karoserie.setBarva( b);
        nakresli();
    }

    public void nakresli()
    {
        celek.nakresli();
    }

    /***************************************************************************
     * Vrátí x-ovou (vodorovnou) souřadnici pozice instance.
     *
     * @return  Aktuální vodorovná (x-ová) souřadnice instance,
     *          x=0 má levý okraj plátna, souřadnice roste doprava
     */
    //     @Override
    public int getX()
    {
        return   celek.getX();
    }

    /***************************************************************************
     * Vrátí y-ovou (svislou) souřadnici pozice instance.
     *
     * @return  Aktuální svislá (y-ová) souřadnice instance,
     *          y=0 má horní okraj plátna, souřadnice roste dolů
     */
    //     @Override
    public int getY()
    {
        return   celek.getY();
    }

    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param x  Nově nastavovaná vodorovná (x-ová) souřadnice instance,
     *           x=0 má levý okraj plátna, souřadnice roste doprava
     * @param y  Nově nastavovaná svislá (y-ová) souřadnice instance,
     *           y=0 má horní okraj plátna, souřadnice roste dolů
     */
    //     @Override
    public void setPozice(int x, int y)
    {
        celek.setPozice( x, y);
        nakresli();
    }

    /***************************************************************************
     * Vrátí šířku instance.
     *
     * @return  Šířka instance v bodech
     */
    //     @Override
    public int getŠířka()
    {
        return celek.getŠířka();
    }

    /***************************************************************************
     * Vrátí výšku instance.
     *
     * @return  Výška instance v bodech
     */
    //     @Override
    public int getVýška()
    {
        return celek.getVýška();
    }

    /***************************************************************************
     * Nastaví nové rozměry instance.
     *
     * @param šířka    Nově nastavovaná šířka; šířka>0
     * @param výška    Nově nastavovaná výška; výška>0
     */
    //     @Override
    public void setRozměr(int šířka, int výška)
    {
        celek.setRozměr(šířka, výška);
        nakresli();
    }

    /***************************************************************************
     * Prostřednictvím dodaného kreslítka vykreslí obraz své instance.
     *
     * @param kreslítko Kreslítko, které nakreslí instanci
     */
    //     @Override
    public void nakresli(Kreslítko kreslítko)
    {
        celek.nakresli(kreslítko);
    }

    /***************************************************************************
     * Vrátí svoji kopii, tj. instanci s naprosto shodnými vlastnostmi
     * s výjimkou těch, které podle kontraktu shodné být nesmějí - v tomto
     * případě stejný tvar, stejně velký, stejně umístěný a se stejnou barvou.
     * <p>
     * Oproti verzi zděděné z předka {@code IKopírovatelný} omezuje typ
     * vrácené hodnoty na sebe sama, tj. na {@code ITvar}.
     *
     * @return Požadovaná kopie
     */
    @Override
    public ITvar kopie()
    {
        return (ITvar) new AutoJ( celek);
    }


 public void vpred( int posun){
    //setPozice( getX(),getY() + this.getVýška());
     celek.setPozice( getX(), getY() + posun);
     //nakresli();
    }

         /***************************************************************************
     * Šablona metody.
     *
     * @param  x   Popis parametru
     * @return     Popis vrácené hodnoty
     * @throws Ex  Popis vyhazované výjimky
     */
    public IAuto1 doleva()
{
    return new AutoV( getX(),getY(),getŠířka(),getVýška()) ;
}


    /***************************************************************************
     * Šablona metody.
     *
     * @param  x   Popis parametru
     * @return     Popis vrácené hodnoty
     * @throws Ex  Popis vyhazované výjimky
     */
    public IAuto1 doprava()
{
    return new AutoZ( getX(),getY(),getŠířka(),getVýška()) ;
}

    /***************************************************************************
     * Vrátí instanci třídy {@code Rozměr} s aktuálními rozměry instance.
     *
     * @return   Instance třídy {@code Rozměr} s aktuálními rozměry instance
     */
//     @Override
     public Rozměr getRozměr()
     {
             return null;
    }


    /***************************************************************************
     * Nastaví nové rozměry instance.
     *
     * @param rozměr  Nově nastavovaný rozměr
     */
//     @Override
    public void setRozměr(Rozměr rozměr)
    {
            setRozměr( rozměr.getŠířka(), rozměr.getVýška());
    }

        /***************************************************************************
     * Vrátí instanci třídy {@code Pozice} s aktuální pozicí instance.
     *
     * @return  Instance třídy {@code Pozice} s aktuální pozicí instance
     */
//     @Override
    public Pozice getPozice()
    {
        return new Pozice( celek.getX(), celek.getY());
    }

            /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param pozice   Nastavovaná pozice instance
     */
//     @Override
    public void setPozice(Pozice pozice)
    {
        setPozice( pozice.getX(), pozice.getY());
    }

     /***************************************************************************
     * Vrátí směr, do nějž je instance natočena.
     *
     * @return Směr, do nějž je instance natočena
     */
//    @Override
    public Směr8 getSměr()
    {
        return Směr8.JIH;
    }
    
     /***************************************************************************
     * Metoda vyvolaná multipřesouvačem poté, co dovedl svěřený objekt
     * do zadané cílové pozice. Při svém typickém použití metoda nastaví
     * novou cílovou pozici své instance a instanci opět předá multipřesouvači.
     */
//     @Override
    public void přesunuto()
    {
        System.out.println( "přesunuto");
    }

}

